{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "83c3ae56-34a9-42fe-94d1-488609d0fb4f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.path import Path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "3aceb54c-8dc4-4e79-952c-46d2d49313e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取Excel文件\n",
    "df_task = pd.read_excel('../data/Q1.xlsx')  \n",
    "df_member = pd.read_excel('../data/Q2.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "6a0df80a-f68e-45c6-8224-0e576c72c976",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况\n",
       "0    A0001  22.566142  113.980837  66.0       0\n",
       "1    A0002  22.686205  113.940525  65.5       0\n",
       "2    A0003  22.576512  113.957198  65.5       1\n",
       "3    A0004  22.564841  114.244571  75.0       0\n",
       "4    A0005  22.558888  113.950723  65.5       0\n",
       "..     ...        ...         ...   ...     ...\n",
       "830  A0831  23.044062  113.125784  65.5       0\n",
       "831  A0832  22.833262  113.280152  72.0       1\n",
       "832  A0833  22.814676  113.827731  85.0       1\n",
       "833  A0834  23.063674  113.771188  65.5       1\n",
       "834  A0835  23.123294  113.110382  85.0       1\n",
       "\n",
       "[835 rows x 5 columns]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "f3803483-1e2c-42b4-b6fb-c53886960c3c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>会员编号</th>\n",
       "      <th>会员位置(GPS)</th>\n",
       "      <th>预订任务限额</th>\n",
       "      <th>预订任务开始时间</th>\n",
       "      <th>信誉值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>B0001</td>\n",
       "      <td>22.947097 113.679983</td>\n",
       "      <td>114</td>\n",
       "      <td>06:30:00</td>\n",
       "      <td>67997.3868</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>B0002</td>\n",
       "      <td>22.577792 113.966524</td>\n",
       "      <td>163</td>\n",
       "      <td>06:30:00</td>\n",
       "      <td>37926.5416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>B0003</td>\n",
       "      <td>23.192458 113.347272</td>\n",
       "      <td>139</td>\n",
       "      <td>06:30:00</td>\n",
       "      <td>27953.0363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>B0004</td>\n",
       "      <td>23.255965 113.31875</td>\n",
       "      <td>98</td>\n",
       "      <td>06:30:00</td>\n",
       "      <td>25085.6986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>B0005</td>\n",
       "      <td>33.65205 116.97047</td>\n",
       "      <td>66</td>\n",
       "      <td>06:30:00</td>\n",
       "      <td>20919.0667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1872</th>\n",
       "      <td>B1873</td>\n",
       "      <td>22.840505 113.277245</td>\n",
       "      <td>1</td>\n",
       "      <td>08:00:00</td>\n",
       "      <td>0.0124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1873</th>\n",
       "      <td>B1874</td>\n",
       "      <td>23.069415 113.287606</td>\n",
       "      <td>1</td>\n",
       "      <td>08:00:00</td>\n",
       "      <td>0.0121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1874</th>\n",
       "      <td>B1875</td>\n",
       "      <td>23.333446 113.301736</td>\n",
       "      <td>1</td>\n",
       "      <td>08:00:00</td>\n",
       "      <td>0.0062</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1875</th>\n",
       "      <td>B1876</td>\n",
       "      <td>22.693506 113.994101</td>\n",
       "      <td>1</td>\n",
       "      <td>08:00:00</td>\n",
       "      <td>0.0036</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1876</th>\n",
       "      <td>B1877</td>\n",
       "      <td>23.133238 113.239864</td>\n",
       "      <td>1</td>\n",
       "      <td>08:00:00</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1877 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       会员编号             会员位置(GPS)  预订任务限额  预订任务开始时间         信誉值\n",
       "0     B0001  22.947097 113.679983     114  06:30:00  67997.3868\n",
       "1     B0002  22.577792 113.966524     163  06:30:00  37926.5416\n",
       "2     B0003  23.192458 113.347272     139  06:30:00  27953.0363\n",
       "3     B0004   23.255965 113.31875      98  06:30:00  25085.6986\n",
       "4     B0005    33.65205 116.97047      66  06:30:00  20919.0667\n",
       "...     ...                   ...     ...       ...         ...\n",
       "1872  B1873  22.840505 113.277245       1  08:00:00      0.0124\n",
       "1873  B1874  23.069415 113.287606       1  08:00:00      0.0121\n",
       "1874  B1875  23.333446 113.301736       1  08:00:00      0.0062\n",
       "1875  B1876  22.693506 113.994101       1  08:00:00      0.0036\n",
       "1876  B1877  23.133238 113.239864       1  08:00:00      0.0001\n",
       "\n",
       "[1877 rows x 5 columns]"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_member"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "e6e17763-487f-4e7b-a749-e363712437d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      66.0\n",
       "1      65.5\n",
       "2      65.5\n",
       "3      75.0\n",
       "4      65.5\n",
       "       ... \n",
       "830    65.5\n",
       "831    72.0\n",
       "832    85.0\n",
       "833    65.5\n",
       "834    85.0\n",
       "Name: 任务标价, Length: 835, dtype: float64"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task['任务标价']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15e59426-5485-4a2b-938e-1290bcdb598d",
   "metadata": {},
   "source": [
    "基准值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "5d73dd56-321f-4f52-9a3c-f5290941a965",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "65.0"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "min(df_task['任务标价'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2396a25c-59dd-4962-933b-9ef6b5a47ca3",
   "metadata": {},
   "source": [
    "## 1、会员因素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "04664d0a-917d-4ed3-8344-0275c64cd4f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "def euclidean_distance(lat1, lon1, lat2, lon2):\n",
    "    # 将纬度和经度转换为相同单位\n",
    "    delta_lat = lat2 - lat1\n",
    "    delta_lon = lon2 - lon1\n",
    "    \n",
    "    # 简单的欧几里得距离\n",
    "    return math.sqrt(delta_lat ** 2 + delta_lon ** 2) * 111  # 1度大约为111公里"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "a78445bf-a6d0-49dc-9a2d-d5e9f61e357e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 统计每个任务点1km内的顾客数量\n",
    "result_member = []\n",
    "\n",
    "for index, task in df_task.iterrows():\n",
    "    task_lat, task_lon = task['任务gps纬度'], task['任务gps经度']\n",
    "    count = 0\n",
    "    score = 0\n",
    "    members_within_1km = []  # 用于存储1km内的顾客信息\n",
    "\n",
    "    # 遍历1km内的所有顾客\n",
    "    for _, member in df_member.iterrows():\n",
    "        member_lat, member_lon = map(float, member['会员位置(GPS)'].split())\n",
    "        distance = euclidean_distance(task_lat, task_lon, member_lat, member_lon)\n",
    "        \n",
    "        if distance <= 1:\n",
    "            count += 1\n",
    "            members_within_1km.append({\n",
    "                '会员ID': member['会员编号'],  # 可选，用于标识会员\n",
    "                '信誉分': member['信誉值'],\n",
    "                '距离': distance\n",
    "            })\n",
    "            # 分数累积\n",
    "            score += (member['预订任务限额'] + math.sqrt(member['信誉值'])) * (1-distance) * 0.01\n",
    "\n",
    "    result_member.append({\n",
    "        '任务号码': task['任务号码'], \n",
    "        '1km内顾客数量': count,\n",
    "        '顾客信息': members_within_1km,  # 存储顾客的信誉分和距离\n",
    "        '该任务点的会员因子分数': score      # 该任务点的会员因子分数\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "c1b658ed-2b36-48d3-b387-a34eeb97a5fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>1km内顾客数量</th>\n",
       "      <th>顾客信息</th>\n",
       "      <th>该任务点的会员因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>12</td>\n",
       "      <td>[{'会员ID': 'B0283', '信誉分': 79.6925, '距离': 0.798...</td>\n",
       "      <td>0.259111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>2</td>\n",
       "      <td>[{'会员ID': 'B0354', '信誉分': 53.1584, '距离': 0.514...</td>\n",
       "      <td>0.096090</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>2</td>\n",
       "      <td>[{'会员ID': 'B0712', '信誉分': 19.9231, '距离': 0.321...</td>\n",
       "      <td>0.064608</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>3</td>\n",
       "      <td>[{'会员ID': 'B0339', '信誉分': 59.7694, '距离': 0.832...</td>\n",
       "      <td>0.081730</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'会员ID': 'B1873', '信誉分': 0.0124, '距离': 0.8662...</td>\n",
       "      <td>0.001486</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>4</td>\n",
       "      <td>[{'会员ID': 'B0215', '信誉分': 115.5408, '距离': 0.80...</td>\n",
       "      <td>0.335116</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'会员ID': 'B1428', '信誉分': 2.0, '距离': 0.1522549...</td>\n",
       "      <td>0.028944</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码  1km内顾客数量                                               顾客信息  \\\n",
       "0    A0001         0                                                 []   \n",
       "1    A0002        12  [{'会员ID': 'B0283', '信誉分': 79.6925, '距离': 0.798...   \n",
       "2    A0003         2  [{'会员ID': 'B0354', '信誉分': 53.1584, '距离': 0.514...   \n",
       "3    A0004         0                                                 []   \n",
       "4    A0005         2  [{'会员ID': 'B0712', '信誉分': 19.9231, '距离': 0.321...   \n",
       "..     ...       ...                                                ...   \n",
       "830  A0831         3  [{'会员ID': 'B0339', '信誉分': 59.7694, '距离': 0.832...   \n",
       "831  A0832         1  [{'会员ID': 'B1873', '信誉分': 0.0124, '距离': 0.8662...   \n",
       "832  A0833         0                                                 []   \n",
       "833  A0834         4  [{'会员ID': 'B0215', '信誉分': 115.5408, '距离': 0.80...   \n",
       "834  A0835         1  [{'会员ID': 'B1428', '信誉分': 2.0, '距离': 0.1522549...   \n",
       "\n",
       "     该任务点的会员因子分数  \n",
       "0       0.000000  \n",
       "1       0.259111  \n",
       "2       0.096090  \n",
       "3       0.000000  \n",
       "4       0.064608  \n",
       "..           ...  \n",
       "830     0.081730  \n",
       "831     0.001486  \n",
       "832     0.000000  \n",
       "833     0.335116  \n",
       "834     0.028944  \n",
       "\n",
       "[835 rows x 4 columns]"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 转换为DataFrame并显示\n",
    "df_result_member = pd.DataFrame(result_member)\n",
    "df_result_member"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f25dd614-f594-466b-9950-210eaf4bf860",
   "metadata": {},
   "source": [
    "## 2、竞争因素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "a90647f5-40b5-4aa6-bc83-da375216eb03",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 统计每个任务点1km内的其他任务点数量\n",
    "result_cpt = []\n",
    "\n",
    "for index, task in df_task.iterrows():\n",
    "    task_lat, task_lon = task['任务gps纬度'], task['任务gps经度']\n",
    "    count = 0\n",
    "    score = 0\n",
    "    tasks_within_1km = []  # 用于存储1km内的顾客信息\n",
    "\n",
    "    # 遍历1km内的所有其他任务点\n",
    "    for _, oppotask in df_task.iterrows():\n",
    "        oppotask_lat, oppotask_lon = oppotask['任务gps纬度'], oppotask['任务gps经度']\n",
    "        distance = euclidean_distance(task_lat, task_lon, oppotask_lat, oppotask_lon)\n",
    "        \n",
    "        if distance <= 1 and distance != 0:\n",
    "            count += 1\n",
    "            tasks_within_1km.append({\n",
    "                '任务号码': oppotask['任务号码'],  # 可选，用于标识会员\n",
    "                '距离': distance\n",
    "            })\n",
    "            # 分数累积\n",
    "            score += min(math.sqrt(1 / distance) * 0.1, 5)\n",
    "\n",
    "    result_cpt.append({\n",
    "        '其他任务ID': task['任务号码'], \n",
    "        '1km内其他任务点数量': count,\n",
    "        '其他任务点的信息': tasks_within_1km,  # 存储顾客的信誉分和距离\n",
    "        '该任务点的竞争因子分数': score      # 该任务点的竞争因子分数\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "28606749-fe1c-40ff-b807-04bf8ae1ddbe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>其他任务ID</th>\n",
       "      <th>1km内其他任务点数量</th>\n",
       "      <th>其他任务点的信息</th>\n",
       "      <th>该任务点的竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>2</td>\n",
       "      <td>[{'任务号码': 'A0029', '距离': 0.20568449470847416},...</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>2</td>\n",
       "      <td>[{'任务号码': 'A0364', '距离': 0.6155373624668447}, ...</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'任务号码': 'A0360', '距离': 0.6919575182975204}]</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'任务号码': 'A0006', '距离': 0.7422286186792472}]</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'任务号码': 'A0008', '距离': 0.7796263532124108}]</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>1</td>\n",
       "      <td>[{'任务号码': 'A0609', '距离': 0.5444309928747162}]</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>2</td>\n",
       "      <td>[{'任务号码': 'A0521', '距离': 0.9278951895677189}, ...</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>0</td>\n",
       "      <td>[]</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    其他任务ID  1km内其他任务点数量                                           其他任务点的信息  \\\n",
       "0    A0001            2  [{'任务号码': 'A0029', '距离': 0.20568449470847416},...   \n",
       "1    A0002            2  [{'任务号码': 'A0364', '距离': 0.6155373624668447}, ...   \n",
       "2    A0003            1      [{'任务号码': 'A0360', '距离': 0.6919575182975204}]   \n",
       "3    A0004            1      [{'任务号码': 'A0006', '距离': 0.7422286186792472}]   \n",
       "4    A0005            1      [{'任务号码': 'A0008', '距离': 0.7796263532124108}]   \n",
       "..     ...          ...                                                ...   \n",
       "830  A0831            1      [{'任务号码': 'A0609', '距离': 0.5444309928747162}]   \n",
       "831  A0832            0                                                 []   \n",
       "832  A0833            0                                                 []   \n",
       "833  A0834            2  [{'任务号码': 'A0521', '距离': 0.9278951895677189}, ...   \n",
       "834  A0835            0                                                 []   \n",
       "\n",
       "     该任务点的竞争因子分数  \n",
       "0       0.321041  \n",
       "1       0.238261  \n",
       "2       0.120215  \n",
       "3       0.116073  \n",
       "4       0.113255  \n",
       "..           ...  \n",
       "830     0.135528  \n",
       "831     0.000000  \n",
       "832     0.000000  \n",
       "833     0.804301  \n",
       "834     0.000000  \n",
       "\n",
       "[835 rows x 4 columns]"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 转换为DataFrame并显示\n",
    "df_result_cpt = pd.DataFrame(result_cpt)\n",
    "df_result_cpt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72f3be20-077c-43e6-b47b-8b6eaa758a55",
   "metadata": {},
   "source": [
    "训练完，得到 k、w，然后再定价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "03cb3c02-5805-443b-a881-4242ffdc694d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203\n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857\n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525\n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365\n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314\n",
       "..     ...        ...         ...   ...     ...        ...\n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292\n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432\n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000\n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085\n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719\n",
       "\n",
       "[835 rows x 6 columns]"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "price = []  # 初始化价格列表\n",
    "k = 5\n",
    "w = 5\n",
    "\n",
    "for i in df_task.index:  # 使用 .index 确保按索引遍历\n",
    "    # 假设 df_result_member 是 DataFrame，并且 i 是任务点的标识符\n",
    "    member_factor = df_result_member.loc[i, '该任务点的会员因子分数']\n",
    "    competition_factor = df_result_cpt.loc[i, '该任务点的竞争因子分数']\n",
    "    \n",
    "    # 计算该任务点的价格\n",
    "    task_price = min(65 + k * member_factor + w * competition_factor, 120) # 不能超过这个价格\n",
    "    \n",
    "    # 将计算的价格添加到 price 列表\n",
    "    price.append(task_price)\n",
    "\n",
    "# 如果你希望将 price 添加为 df_task 的一列，可以使用以下代码\n",
    "df_task['预测合理价格'] = price\n",
    "df_task"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b807ee33-ff18-459b-899c-cc51f0cdd74a",
   "metadata": {},
   "source": [
    "校验定价区间合理性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "c28f460f-2ea9-455b-bed4-9cf3cc81f6fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "65.0"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task['预测合理价格'].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "a90cdf67-b028-429d-b0ea-81e6e0f7e1ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "84.59215009615079"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task['预测合理价格'].max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "bd99eac6-1660-4daa-8479-ade2b052a198",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "66.6864803564597"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task['预测合理价格'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "868ec50d-bfb4-4786-917f-c65bb013eecb",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "\n",
    "# 1. 预处理数据\n",
    "# 将会员位置(GPS)拆分为经度和纬度\n",
    "df_member[['会员纬度', '会员经度']] = df_member['会员位置(GPS)'].str.split(expand=True).astype(float)\n",
    "\n",
    "# 选择任务数据和会员数据的特征进行合并\n",
    "# 例如：根据任务ID或其他关联特征合并数据\n",
    "# 这里假设任务表和会员表已经预先关联好\n",
    "df = pd.merge(df_task, df_member, left_on='任务gps纬度', right_on='会员纬度', how='left')\n",
    "\n",
    "# 特征选择（可以根据你的数据进行调整）\n",
    "X = df[['任务gps纬度', '任务gps经度', '任务标价', '信誉值', '预订任务限额']]\n",
    "y = df['任务执行情况']  # 这是你要预测的目标变量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "377838a8-d877-4b4a-a8f0-257aa73c77ff",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8323353293413174\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.82      0.79        66\n",
      "           1       0.88      0.84      0.86       101\n",
      "\n",
      "    accuracy                           0.83       167\n",
      "   macro avg       0.82      0.83      0.83       167\n",
      "weighted avg       0.83      0.83      0.83       167\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 2. 数据分割为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 模型训练\n",
    "model = RandomForestClassifier(random_state=42)\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 4. 预测\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "# 5. 模型评估\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "report = classification_report(y_test, y_pred)\n",
    "\n",
    "print(f\"Accuracy: {accuracy}\")\n",
    "print(\"Classification Report:\")\n",
    "print(report)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65f308be-cf9d-481a-a2f5-d0fc737852ab",
   "metadata": {},
   "source": [
    "## 原本数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "5f59679c-5fdf-4d41-922d-5a2f9a08bd41",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203\n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857\n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525\n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365\n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314\n",
       "..     ...        ...         ...   ...     ...        ...\n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292\n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432\n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000\n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085\n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719\n",
       "\n",
       "[835 rows x 6 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a03a562-fa93-4a01-84ac-33d40fffe294",
   "metadata": {},
   "source": [
    "在原本任务表Q1中，加上不含k,w的那两列原始影响数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "f82a6b52-d96b-4c5b-85c4-3027dfc9a7bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 假设 df_result_member 和 df_result_cpt 是单列的 DataFrame，且与 df_task 具有相同的索引\n",
    "\n",
    "# 首先将会员因子分数和竞争因子分数合并到 df_task 中\n",
    "df_new_task = df_task.copy()  # 复制原始任务数据\n",
    "\n",
    "# 添加会员因子分数列\n",
    "df_new_task['会员因子分数'] = df_result_member['该任务点的会员因子分数']\n",
    "\n",
    "# 添加竞争因子分数列\n",
    "df_new_task['竞争因子分数'] = df_result_cpt['该任务点的竞争因子分数']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "577a929f-e4bf-4809-8be4-987d32e42720",
   "metadata": {},
   "source": [
    "此时 df_new_task 为加上特征后的 df，因此可以开始训练！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "94db15f4-0313-49d5-bfd4-960c74268d3a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格    会员因子分数    竞争因子分数\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203  0.000000  0.321041\n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857  0.259111  0.238261\n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525  0.096090  0.120215\n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365  0.000000  0.116073\n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314  0.064608  0.113255\n",
       "..     ...        ...         ...   ...     ...        ...       ...       ...\n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292  0.081730  0.135528\n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432  0.001486  0.000000\n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000  0.000000  0.000000\n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085  0.335116  0.804301\n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719  0.028944  0.000000\n",
       "\n",
       "[835 rows x 8 columns]"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new_task"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f8651a0-c415-4c43-8ecf-b4ec8880df7a",
   "metadata": {},
   "source": [
    "## 预测完成率\n",
    "#### 先随机森林训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "99600c95-34c5-4409-94d3-09a4cd8a420d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.8562874251497006\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.81      0.83      0.82        66\n",
      "           1       0.89      0.87      0.88       101\n",
      "\n",
      "    accuracy                           0.86       167\n",
      "   macro avg       0.85      0.85      0.85       167\n",
      "weighted avg       0.86      0.86      0.86       167\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "\n",
    "# 1. 准备数据\n",
    "# X 是特征集，选择 '任务标价'、'会员因子分数' 和 '竞争因子分数' 列\n",
    "X = df_new_task[['任务gps纬度', '任务gps经度', '任务标价', '会员因子分数', '竞争因子分数']]\n",
    "\n",
    "# y 是目标变量，选择 '任务执行情况' 列\n",
    "y = df_new_task['任务执行情况']\n",
    "\n",
    "# 2. 数据分割为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 模型训练\n",
    "model = RandomForestClassifier(n_estimators=200, random_state=42)\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 4. 预测\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "# 5. 模型评估\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "report = classification_report(y_test, y_pred)\n",
    "\n",
    "print(f\"Accuracy: {accuracy}\")\n",
    "print(\"Classification Report:\")\n",
    "print(report)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6faf2fdc-e4ba-4078-a0d4-98f5f7298185",
   "metadata": {},
   "source": [
    "调参：树的棵树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "7681361e-8892-4b11-aa69-d31198d2e17e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best n_estimators: 180 with Accuracy: 0.8562874251497006\n",
      "n_estimators: 10, Accuracy: 0.8143712574850299\n",
      "n_estimators: 20, Accuracy: 0.8383233532934131\n",
      "n_estimators: 30, Accuracy: 0.8203592814371258\n",
      "n_estimators: 40, Accuracy: 0.8203592814371258\n",
      "n_estimators: 50, Accuracy: 0.8263473053892215\n",
      "n_estimators: 60, Accuracy: 0.8323353293413174\n",
      "n_estimators: 70, Accuracy: 0.8383233532934131\n",
      "n_estimators: 80, Accuracy: 0.8203592814371258\n",
      "n_estimators: 90, Accuracy: 0.8383233532934131\n",
      "n_estimators: 100, Accuracy: 0.8323353293413174\n",
      "n_estimators: 110, Accuracy: 0.8383233532934131\n",
      "n_estimators: 120, Accuracy: 0.844311377245509\n",
      "n_estimators: 130, Accuracy: 0.8502994011976048\n",
      "n_estimators: 140, Accuracy: 0.8502994011976048\n",
      "n_estimators: 150, Accuracy: 0.844311377245509\n",
      "n_estimators: 160, Accuracy: 0.8502994011976048\n",
      "n_estimators: 170, Accuracy: 0.8502994011976048\n",
      "n_estimators: 180, Accuracy: 0.8562874251497006\n",
      "n_estimators: 190, Accuracy: 0.8562874251497006\n",
      "n_estimators: 200, Accuracy: 0.8562874251497006\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# 1. 准备数据\n",
    "X = df_new_task[['任务gps纬度', '任务gps经度', '任务标价', '会员因子分数', '竞争因子分数']]\n",
    "y = df_new_task['任务执行情况']\n",
    "\n",
    "# 2. 数据分割为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 调参\n",
    "best_accuracy = 0\n",
    "best_n_estimators = 0\n",
    "accuracies = []\n",
    "\n",
    "for n in range(10, 201, 10):\n",
    "    model = RandomForestClassifier(n_estimators=n, random_state=42)\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    accuracy = accuracy_score(y_test, y_pred)\n",
    "    accuracies.append((n, accuracy))\n",
    "    \n",
    "    if accuracy > best_accuracy:\n",
    "        best_accuracy = accuracy\n",
    "        best_n_estimators = n\n",
    "\n",
    "# 输出最佳结果\n",
    "print(f\"Best n_estimators: {best_n_estimators} with Accuracy: {best_accuracy}\")\n",
    "\n",
    "# 打印每个 n_estimators 对应的准确率\n",
    "for n, accuracy in accuracies:\n",
    "    print(f\"n_estimators: {n}, Accuracy: {accuracy}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a68606e-567b-4b43-b406-0dea0c0874fb",
   "metadata": {},
   "source": [
    "新的完成率预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0096487-a285-4c12-b8bb-db9372256ef5",
   "metadata": {},
   "source": [
    "复原列名（复原个屁...，如果下面的代码出错，就执行这个代码进行复原，但是从上往下执行的话，要跳过下面这一段代码块！！！）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "56aecc89-95fc-44ba-ab5f-2dcbbc579822",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 获取列名列表\n",
    "# columns = df_new_task.columns.to_list()\n",
    "\n",
    "# # 获取第一个 '任务标价' 的索引位置\n",
    "# first_index = columns.index('预测合理价格')\n",
    "\n",
    "# # 重命名第一个 '任务标价' 列的名称\n",
    "# df_new_task.columns.values[first_index] = '任务标价'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "7e0db308-ba65-4c5b-a8e6-fa610c54d5e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 8 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格    会员因子分数    竞争因子分数\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203  0.000000  0.321041\n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857  0.259111  0.238261\n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525  0.096090  0.120215\n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365  0.000000  0.116073\n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314  0.064608  0.113255\n",
       "..     ...        ...         ...   ...     ...        ...       ...       ...\n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292  0.081730  0.135528\n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432  0.001486  0.000000\n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000  0.000000  0.000000\n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085  0.335116  0.804301\n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719  0.028944  0.000000\n",
       "\n",
       "[835 rows x 8 columns]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看修改后的 DataFrame\n",
    "df_new_task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "95edb690-4637-4a01-929f-3b51aebc1762",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       任务gps纬度     任务gps经度     预测合理价格    会员因子分数    竞争因子分数\n",
       "0    22.566142  113.980837  66.605203  0.000000  0.321041\n",
       "1    22.686205  113.940525  67.486857  0.259111  0.238261\n",
       "2    22.576512  113.957198  66.081525  0.096090  0.120215\n",
       "3    22.564841  114.244571  65.580365  0.000000  0.116073\n",
       "4    22.558888  113.950723  65.889314  0.064608  0.113255\n",
       "..         ...         ...        ...       ...       ...\n",
       "830  23.044062  113.125784  66.086292  0.081730  0.135528\n",
       "831  22.833262  113.280152  65.007432  0.001486  0.000000\n",
       "832  22.814676  113.827731  65.000000  0.000000  0.000000\n",
       "833  23.063674  113.771188  70.697085  0.335116  0.804301\n",
       "834  23.123294  113.110382  65.144719  0.028944  0.000000\n",
       "\n",
       "[835 rows x 5 columns]"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 1. 准备新的特征集 X（使用 '预测合理价格' 列）\n",
    "X_new = df_new_task[['任务gps纬度', '任务gps经度', '预测合理价格', '会员因子分数', '竞争因子分数']]\n",
    "X_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "a20b23a7-2094-41ce-a821-ecee34ca3916",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       任务gps纬度     任务gps经度       任务标价    会员因子分数    竞争因子分数\n",
       "0    22.566142  113.980837  66.605203  0.000000  0.321041\n",
       "1    22.686205  113.940525  67.486857  0.259111  0.238261\n",
       "2    22.576512  113.957198  66.081525  0.096090  0.120215\n",
       "3    22.564841  114.244571  65.580365  0.000000  0.116073\n",
       "4    22.558888  113.950723  65.889314  0.064608  0.113255\n",
       "..         ...         ...        ...       ...       ...\n",
       "830  23.044062  113.125784  66.086292  0.081730  0.135528\n",
       "831  22.833262  113.280152  65.007432  0.001486  0.000000\n",
       "832  22.814676  113.827731  65.000000  0.000000  0.000000\n",
       "833  23.063674  113.771188  70.697085  0.335116  0.804301\n",
       "834  23.123294  113.110382  65.144719  0.028944  0.000000\n",
       "\n",
       "[835 rows x 5 columns]"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将 '预测合理价格' 列重命名为 '任务标价'\n",
    "X_new = X_new.rename(columns={'预测合理价格': '任务标价'})\n",
    "# X_new = X_new.rename(columns={'任务标价': '预测合理价格'})\n",
    "X_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "d6d82e0e-bb9f-4118-b1d4-57101c1c3a55",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "      <th>预测任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格    会员因子分数  \\\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203  0.000000   \n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857  0.259111   \n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525  0.096090   \n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365  0.000000   \n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314  0.064608   \n",
       "..     ...        ...         ...   ...     ...        ...       ...   \n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292  0.081730   \n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432  0.001486   \n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000  0.000000   \n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085  0.335116   \n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719  0.028944   \n",
       "\n",
       "       竞争因子分数  预测任务执行情况  \n",
       "0    0.321041         0  \n",
       "1    0.238261         0  \n",
       "2    0.120215         0  \n",
       "3    0.116073         0  \n",
       "4    0.113255         0  \n",
       "..        ...       ...  \n",
       "830  0.135528         0  \n",
       "831  0.000000         1  \n",
       "832  0.000000         1  \n",
       "833  0.804301         1  \n",
       "834  0.000000         1  \n",
       "\n",
       "[835 rows x 9 columns]"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2. 使用已经训练好的模型进行预测\n",
    "# 假设 model 是你之前训练好的模型\n",
    "y_new_pred = model.predict(X_new)\n",
    "\n",
    "# 3. 将新的预测结果存储到 df_new_task 的 '预测任务执行情况' 列中\n",
    "df_new_task['预测任务执行情况'] = y_new_pred\n",
    "\n",
    "# 4. 输出结果查看\n",
    "df_new_task\n",
    "# print(df_new_task[['任务gps纬度', '任务gps经度', '预测合理价格', '会员因子分数', '竞争因子分数', '预测任务执行情况']].head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "733eef77-7488-4ce8-9bb2-0ed9a2acf96c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "521"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new_task['预测任务执行情况'].sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4bb9c7c-bf88-4f33-ad3e-07f1203df464",
   "metadata": {},
   "source": [
    "### 调节k,w\n",
    "由于第一问的结果已知，因此使用这些数据来训练，调参，获得最佳的树的个数  \n",
    "之后调节k,w的值，使得df_new_task['预测任务执行情况'].sum()的值最大，即任务完成率最高  \n",
    "在X_new里面调整就行，省得改来改去乱了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "6bc35c7b-2d58-4116-af5d-0a54ed6ee2f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# X_new = X_new.drop(columns=['预测合理价格'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "fe9a4b13-b625-493e-ad98-a959c11b81f9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>0.335116</td>\n",
       "      <td>0.804301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       任务gps纬度     任务gps经度       任务标价    会员因子分数    竞争因子分数\n",
       "0    22.566142  113.980837  66.605203  0.000000  0.321041\n",
       "1    22.686205  113.940525  67.486857  0.259111  0.238261\n",
       "2    22.576512  113.957198  66.081525  0.096090  0.120215\n",
       "3    22.564841  114.244571  65.580365  0.000000  0.116073\n",
       "4    22.558888  113.950723  65.889314  0.064608  0.113255\n",
       "..         ...         ...        ...       ...       ...\n",
       "830  23.044062  113.125784  66.086292  0.081730  0.135528\n",
       "831  22.833262  113.280152  65.007432  0.001486  0.000000\n",
       "832  22.814676  113.827731  65.000000  0.000000  0.000000\n",
       "833  23.063674  113.771188  70.697085  0.335116  0.804301\n",
       "834  23.123294  113.110382  65.144719  0.028944  0.000000\n",
       "\n",
       "[835 rows x 5 columns]"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "b5cfb105-db36-45af-9c0a-faba03ca1ac4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好的 k 为： 5 w 为： 10 res 为： 535\n"
     ]
    }
   ],
   "source": [
    "# 初始化参数\n",
    "best_k = 1\n",
    "best_w = 1\n",
    "best_res = 0\n",
    "\n",
    "# 网格搜索 k 和 w 的值\n",
    "for k in range(1, 11):  # 语法修改：range(1, 11) 代表从 1 到 10\n",
    "    for w in range(1, 11):\n",
    "        \n",
    "        price = []  # 初始化价格列表\n",
    "        \n",
    "        for i in df_new_task.index:  # 使用 .index 确保按索引遍历\n",
    "            # 获取会员因子分数和竞争因子分数\n",
    "            m_factor = df_new_task.loc[i, '会员因子分数']\n",
    "            c_factor = df_new_task.loc[i, '竞争因子分数']\n",
    "            \n",
    "            # 计算该任务点的价格\n",
    "            task_price = 65 + k * m_factor + w * c_factor\n",
    "            \n",
    "            # 将计算的价格添加到 price 列表\n",
    "            price.append(task_price)\n",
    "        \n",
    "        # 更新 '预测合理价格' 列\n",
    "        X_new['任务标价'] = price\n",
    "        \n",
    "        # 使用训练好的模型进行预测\n",
    "        y_new_pred = model.predict(X_new)\n",
    "        \n",
    "        # 将新的预测结果存储到 df_new_task 的 '预测任务执行情况' 列中\n",
    "        df_new_task['预测任务执行情况'] = y_new_pred\n",
    "        \n",
    "        # 计算当前配置下预测的任务执行情况的总和（比如任务完成的数量）\n",
    "        res = df_new_task['预测任务执行情况'].sum()\n",
    "        \n",
    "        # 更新最佳参数和结果\n",
    "        if res > best_res:\n",
    "            best_k = k\n",
    "            best_w = w\n",
    "            best_res = res\n",
    "\n",
    "print('最好的 k 为：', best_k, 'w 为：', best_w, 'res 为：', best_res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b97ce54-28db-4a0e-8a42-19c94f939814",
   "metadata": {},
   "source": [
    "更精细化的网格搜索，把步长改小就可以，但是运行时间过长“"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "71d233dd-08fa-4c69-82bd-db5c3f356e04",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好的 k 为： 19 w 为： 19 res 为： 555\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 网格搜索 k 和 w 的值，步长为 0.2\n",
    "for k in np.arange(1, 21, 2):  # np.arange(1, 11, 0.2) 代表从 1 到 10，步长为 0.2\n",
    "    for w in np.arange(1, 21, 2):\n",
    "        \n",
    "        price = []  # 初始化价格列表\n",
    "        \n",
    "        for i in df_new_task.index:  # 使用 .index 确保按索引遍历\n",
    "            # 获取会员因子分数和竞争因子分数\n",
    "            m_factor = df_new_task.loc[i, '会员因子分数']\n",
    "            c_factor = df_new_task.loc[i, '竞争因子分数']\n",
    "            \n",
    "            # 计算该任务点的价格\n",
    "            task_price = 65 + k * m_factor + w * c_factor\n",
    "            \n",
    "            # 将计算的价格添加到 price 列表\n",
    "            price.append(task_price)\n",
    "        \n",
    "        # 更新 '预测合理价格' 列\n",
    "        X_new['任务标价'] = price\n",
    "        \n",
    "        # 使用训练好的模型进行预测\n",
    "        y_new_pred = model.predict(X_new)\n",
    "        \n",
    "        # 将新的预测结果存储到 df_new_task 的 '预测任务执行情况' 列中\n",
    "        df_new_task['预测任务执行情况'] = y_new_pred\n",
    "        \n",
    "        # 计算当前配置下预测的任务执行情况的总和（比如任务完成的数量）\n",
    "        res = df_new_task['预测任务执行情况'].sum()\n",
    "        \n",
    "        # 更新最佳参数和结果\n",
    "        if res > best_res:\n",
    "            best_k = k\n",
    "            best_w = w\n",
    "            best_res = res\n",
    "\n",
    "print('最好的 k 为：', best_k, 'w 为：', best_w, 'res 为：', best_res)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "5d057305-8108-482f-89d7-688ce08ff9e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6706586826347305\n"
     ]
    }
   ],
   "source": [
    "print(560/835)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54514ee2-07a2-4fe0-96e9-20ec1ae3f634",
   "metadata": {},
   "source": [
    "## 排除东莞市\n",
    "前面的数据都加入东莞市的数据，但是其实东莞市的任务定价都合理，任务完成率达到100%，再次调整反而无法保证完成率，因此排除掉东莞市，重新进行计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "ccad1657-ebba-4b19-95b5-c33ad7ac3a32",
   "metadata": {},
   "outputs": [],
   "source": [
    "eccept_index = [372, 482, 485, 486, 487, 488, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 538, 611, 612, 614, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 684, 685, 686, 688, 694, 695, 696, 697, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 723, 724, 725, 726, 727, 737, 740, 741, 742, 743, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 775, 778, 779, 780, 781, 784, 786, 801, 802, 803, 804, 805, 806, 807, 827, 832, 833]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "d9ae733f-d144-4456-8664-8e488a6d6f1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员编号</th>\n",
       "      <th>会员位置(GPS)</th>\n",
       "      <th>预订任务限额</th>\n",
       "      <th>预订任务开始时间</th>\n",
       "      <th>信誉值</th>\n",
       "      <th>会员纬度</th>\n",
       "      <th>会员经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>372</th>\n",
       "      <td>A0373</td>\n",
       "      <td>23.097051</td>\n",
       "      <td>113.658152</td>\n",
       "      <td>68.0</td>\n",
       "      <td>1</td>\n",
       "      <td>67.149492</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>482</th>\n",
       "      <td>A0483</td>\n",
       "      <td>23.044908</td>\n",
       "      <td>113.788434</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.505060</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>485</th>\n",
       "      <td>A0486</td>\n",
       "      <td>22.777591</td>\n",
       "      <td>113.751681</td>\n",
       "      <td>70.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.396385</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>486</th>\n",
       "      <td>A0487</td>\n",
       "      <td>22.721038</td>\n",
       "      <td>114.179052</td>\n",
       "      <td>70.5</td>\n",
       "      <td>1</td>\n",
       "      <td>65.043406</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>487</th>\n",
       "      <td>A0488</td>\n",
       "      <td>22.812305</td>\n",
       "      <td>114.172988</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>806</th>\n",
       "      <td>A0807</td>\n",
       "      <td>23.039098</td>\n",
       "      <td>113.773178</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>65.611801</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>807</th>\n",
       "      <td>A0808</td>\n",
       "      <td>22.846704</td>\n",
       "      <td>114.159286</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.544384</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>827</th>\n",
       "      <td>A0828</td>\n",
       "      <td>23.012808</td>\n",
       "      <td>113.760312</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1</td>\n",
       "      <td>68.158712</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格 会员编号 会员位置(GPS)  \\\n",
       "372  A0373  23.097051  113.658152  68.0       1  67.149492  NaN       NaN   \n",
       "482  A0483  23.044908  113.788434  65.5       1  66.505060  NaN       NaN   \n",
       "485  A0486  22.777591  113.751681  70.0       1  65.396385  NaN       NaN   \n",
       "486  A0487  22.721038  114.179052  70.5       1  65.043406  NaN       NaN   \n",
       "487  A0488  22.812305  114.172988  72.0       1  65.000000  NaN       NaN   \n",
       "..     ...        ...         ...   ...     ...        ...  ...       ...   \n",
       "806  A0807  23.039098  113.773178  65.5       1  65.611801  NaN       NaN   \n",
       "807  A0808  22.846704  114.159286  85.0       1  65.544384  NaN       NaN   \n",
       "827  A0828  23.012808  113.760312  66.0       1  68.158712  NaN       NaN   \n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000  NaN       NaN   \n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085  NaN       NaN   \n",
       "\n",
       "     预订任务限额 预订任务开始时间  信誉值  会员纬度  会员经度  \n",
       "372     NaN      NaN  NaN   NaN   NaN  \n",
       "482     NaN      NaN  NaN   NaN   NaN  \n",
       "485     NaN      NaN  NaN   NaN   NaN  \n",
       "486     NaN      NaN  NaN   NaN   NaN  \n",
       "487     NaN      NaN  NaN   NaN   NaN  \n",
       "..      ...      ...  ...   ...   ...  \n",
       "806     NaN      NaN  NaN   NaN   NaN  \n",
       "807     NaN      NaN  NaN   NaN   NaN  \n",
       "827     NaN      NaN  NaN   NaN   NaN  \n",
       "832     NaN      NaN  NaN   NaN   NaN  \n",
       "833     NaN      NaN  NaN   NaN   NaN  \n",
       "\n",
       "[178 rows x 13 columns]"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dongguang_task = df.iloc[eccept_index]\n",
    "dongguang_task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "7c621c80-82a2-40fa-b98e-f873da0f4b2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "70.34269662921348"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dongguang_task['任务标价'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "e0289932-24fb-4305-afe4-0f6d5b95ce12",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12521.0"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dongguang_task['任务标价'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "5400699c-aa2c-42e6-ae4e-6abb1933c292",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_new_task_except = df_new_task.drop(index=eccept_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "1e0baa75-d30f-430a-90c3-fac474316de8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "      <th>预测任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>828</th>\n",
       "      <td>A0829</td>\n",
       "      <td>23.179030</td>\n",
       "      <td>112.876192</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.844845</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.168969</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>829</th>\n",
       "      <td>A0830</td>\n",
       "      <td>23.123411</td>\n",
       "      <td>113.151775</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.030487</td>\n",
       "      <td>0.006097</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>657 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格    会员因子分数  \\\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203  0.000000   \n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857  0.259111   \n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525  0.096090   \n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365  0.000000   \n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314  0.064608   \n",
       "..     ...        ...         ...   ...     ...        ...       ...   \n",
       "828  A0829  23.179030  112.876192  80.0       1  65.844845  0.000000   \n",
       "829  A0830  23.123411  113.151775  85.0       1  65.030487  0.006097   \n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292  0.081730   \n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432  0.001486   \n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719  0.028944   \n",
       "\n",
       "       竞争因子分数  预测任务执行情况  \n",
       "0    0.321041         0  \n",
       "1    0.238261         0  \n",
       "2    0.120215         0  \n",
       "3    0.116073         0  \n",
       "4    0.113255         0  \n",
       "..        ...       ...  \n",
       "828  0.168969         1  \n",
       "829  0.000000         1  \n",
       "830  0.135528         1  \n",
       "831  0.000000         1  \n",
       "834  0.000000         0  \n",
       "\n",
       "[657 rows x 9 columns]"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new_task_except"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "daa0cd2a-e7a9-4ce1-bc1e-cee5211a3dc7",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_new_except = X_new.drop(index=eccept_index)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ef4eab31-0658-4d00-afc8-99afa2794db2",
   "metadata": {},
   "source": [
    "下面我原本是步长为0.2去跑的，但是要运行很久，所以为了节省时间，步长可以调大点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "a9c6ecbe-2b85-4f19-8535-587008f5f5e3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好的 k 为： 29 w 为： 29 res 为： 397\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 初始化参数\n",
    "best_k = 1\n",
    "best_w = 1\n",
    "best_res = 0\n",
    "\n",
    "\n",
    "# 网格搜索 k 和 w 的值，步长为 0.2\n",
    "for k in np.arange(1, 31, 2):  # np.arange(1, 11, 0.2) 代表从 1 到 10，步长为 0.2\n",
    "    for w in np.arange(1, 31, 2):\n",
    "        \n",
    "        price = []  # 初始化价格列表\n",
    "        \n",
    "        for i in df_new_task_except.index:  # 使用 .index 确保按索引遍历\n",
    "            # 获取会员因子分数和竞争因子分数\n",
    "            m_factor = df_new_task_except.loc[i, '会员因子分数']\n",
    "            c_factor = df_new_task_except.loc[i, '竞争因子分数']\n",
    "            \n",
    "            # 计算该任务点的价格\n",
    "            task_price = 65 + k * m_factor + w * c_factor\n",
    "            \n",
    "            # 将计算的价格添加到 price 列表\n",
    "            price.append(task_price) \n",
    "        \n",
    "        # 更新 '预测合理价格' 列\n",
    "        X_new_except['任务标价'] = price\n",
    "        \n",
    "        # 使用训练好的模型进行预测\n",
    "        y_new_pred = model.predict(X_new_except)\n",
    "        \n",
    "        # 将新的预测结果存储到 df_new_task 的 '预测任务执行情况' 列中\n",
    "        df_new_task_except['预测任务执行情况'] = y_new_pred\n",
    "        \n",
    "        # 计算当前配置下预测的任务执行情况的总和（比如任务完成的数量）\n",
    "        res = df_new_task_except['预测任务执行情况'].sum()\n",
    "        \n",
    "        # 更新最佳参数和结果\n",
    "        if res > best_res:\n",
    "            best_k = k\n",
    "            best_w = w\n",
    "            best_res = res\n",
    "\n",
    "print('最好的 k 为：', best_k, 'w 为：', best_w, 'res 为：', best_res)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "a901fdfc-4a13-4682-98c1-4850778af759",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "397"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 初始化参数\n",
    "mk = 29.2\n",
    "mw = 26.8\n",
    "        \n",
    "price = []  # 初始化价格列表\n",
    "\n",
    "for i in df_new_task_except.index:  # 使用 .index 确保按索引遍历\n",
    "    # 获取会员因子分数和竞争因子分数\n",
    "    m_factor = df_new_task_except.loc[i, '会员因子分数']\n",
    "    c_factor = df_new_task_except.loc[i, '竞争因子分数']\n",
    "    \n",
    "    # 计算该任务点的价格\n",
    "    task_price = 65 + k * m_factor + w * c_factor\n",
    "    \n",
    "    # 将计算的价格添加到 price 列表\n",
    "    price.append(task_price)\n",
    "\n",
    "# 更新 '预测合理价格' 列\n",
    "X_new_except['任务标价'] = price\n",
    "df_new_task_except['预测合理价格'] = price\n",
    "\n",
    "# 使用训练好的模型进行预测\n",
    "y_new_pred = model.predict(X_new_except)\n",
    "\n",
    "# 将新的预测结果存储到 df_new_task 的 '预测任务执行情况' 列中\n",
    "df_new_task_except['预测任务执行情况'] = y_new_pred\n",
    "\n",
    "# 计算当前配置下预测的任务执行情况的总和（比如任务完成的数量）\n",
    "res = df_new_task_except['预测任务执行情况'].sum()\n",
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "70ab72ec-6da5-4cff-b41e-08d45d2d0856",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "75.59519298784966"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new_except['任务标价'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "31f8d937-4218-4834-97d1-c0e6cb4fa7e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "49666.041793017226"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new_except['任务标价'].sum()   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "746fa47e-d206-4f27-b060-0ca0282b91bc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "62619.1\n"
     ]
    }
   ],
   "source": [
    "print(12521 + 50098.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a35bcf4-c24b-40c4-a94c-0b00fc9958ea",
   "metadata": {},
   "source": [
    "新平均定价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "c4eb7f7e-5b93-442d-a2ce-28feca5e2692",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "74.99293413173652\n"
     ]
    }
   ],
   "source": [
    "print(62619.1 / 835)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5198fae-87fa-42e8-a79f-415e1a68fa9b",
   "metadata": {},
   "source": [
    "优化好的完成率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "0b06bbd8-f759-429f-808c-8d8675b7d4a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6910179640718563\n"
     ]
    }
   ],
   "source": [
    "print(577/835)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9182af47-e172-4fa3-86dc-6d08a53a24fb",
   "metadata": {},
   "source": [
    "换模型，效果不咋样，还是不换了..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "c9a2c4fc-b485-44cf-806b-fc2d622c5dcc",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Logistic Regression...\n",
      "Accuracy for Logistic Regression: 0.6706586826347305\n",
      "Classification Report for Logistic Regression:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.69      0.30      0.42        66\n",
      "           1       0.67      0.91      0.77       101\n",
      "\n",
      "    accuracy                           0.67       167\n",
      "   macro avg       0.68      0.61      0.60       167\n",
      "weighted avg       0.68      0.67      0.63       167\n",
      "\n",
      "\n",
      "Training Support Vector Machine...\n",
      "Accuracy for Support Vector Machine: 0.6047904191616766\n",
      "Classification Report for Support Vector Machine:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.00      0.00      0.00        66\n",
      "           1       0.60      1.00      0.75       101\n",
      "\n",
      "    accuracy                           0.60       167\n",
      "   macro avg       0.30      0.50      0.38       167\n",
      "weighted avg       0.37      0.60      0.46       167\n",
      "\n",
      "\n",
      "Training K-Nearest Neighbors...\n",
      "Accuracy for K-Nearest Neighbors: 0.7365269461077845\n",
      "Classification Report for K-Nearest Neighbors:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.70      0.59      0.64        66\n",
      "           1       0.76      0.83      0.79       101\n",
      "\n",
      "    accuracy                           0.74       167\n",
      "   macro avg       0.73      0.71      0.72       167\n",
      "weighted avg       0.73      0.74      0.73       167\n",
      "\n",
      "\n",
      "Training Gradient Boosting...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\develop\\miniconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "C:\\develop\\miniconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "C:\\develop\\miniconda3\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1531: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy for Gradient Boosting: 0.7844311377245509\n",
      "Classification Report for Gradient Boosting:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.73      0.71      0.72        66\n",
      "           1       0.82      0.83      0.82       101\n",
      "\n",
      "    accuracy                           0.78       167\n",
      "   macro avg       0.77      0.77      0.77       167\n",
      "weighted avg       0.78      0.78      0.78       167\n",
      "\n",
      "\n",
      "Training XGBoost...\n",
      "Accuracy for XGBoost: 0.8263473053892215\n",
      "Classification Report for XGBoost:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.80      0.79        66\n",
      "           1       0.87      0.84      0.85       101\n",
      "\n",
      "    accuracy                           0.83       167\n",
      "   macro avg       0.82      0.82      0.82       167\n",
      "weighted avg       0.83      0.83      0.83       167\n",
      "\n",
      "\n",
      "Training LightGBM...\n",
      "[LightGBM] [Info] Number of positive: 421, number of negative: 247\n",
      "[LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.000465 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[LightGBM] [Info] Total Bins 767\n",
      "[LightGBM] [Info] Number of data points in the train set: 668, number of used features: 5\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.630240 -> initscore=0.533244\n",
      "[LightGBM] [Info] Start training from score 0.533244\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "[LightGBM] [Warning] No further splits with positive gain, best gain: -inf\n",
      "Accuracy for LightGBM: 0.8383233532934131\n",
      "Classification Report for LightGBM:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.83      0.80        66\n",
      "           1       0.89      0.84      0.86       101\n",
      "\n",
      "    accuracy                           0.84       167\n",
      "   macro avg       0.83      0.84      0.83       167\n",
      "weighted avg       0.84      0.84      0.84       167\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "import xgboost as xgb\n",
    "import lightgbm as lgb\n",
    "\n",
    "# 1. 准备数据\n",
    "X = df_new_task[['任务gps纬度', '任务gps经度', '任务标价', '会员因子分数', '竞争因子分数']]\n",
    "y = df_new_task['任务执行情况']\n",
    "\n",
    "# 2. 数据分割为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 3. 模型列表\n",
    "models = {\n",
    "    \"Logistic Regression\": LogisticRegression(random_state=42),\n",
    "    \"Support Vector Machine\": SVC(random_state=42),\n",
    "    \"K-Nearest Neighbors\": KNeighborsClassifier(),\n",
    "    \"Gradient Boosting\": GradientBoostingClassifier(random_state=42),\n",
    "    \"XGBoost\": xgb.XGBClassifier(random_state=42),\n",
    "    \"LightGBM\": lgb.LGBMClassifier(random_state=42)\n",
    "}\n",
    "\n",
    "# 4. 训练和评估每个模型\n",
    "for name, model in models.items():\n",
    "    print(f\"Training {name}...\")\n",
    "    model.fit(X_train, y_train)\n",
    "    y_pred = model.predict(X_test)\n",
    "    \n",
    "    accuracy = accuracy_score(y_test, y_pred)\n",
    "    report = classification_report(y_test, y_pred)\n",
    "    \n",
    "    print(f\"Accuracy for {name}: {accuracy}\")\n",
    "    print(f\"Classification Report for {name}:\\n{report}\\n\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "8764f0b2-677f-4a3a-9141-9ef3e880a873",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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jD1XRERERESmg8mVmUpMBCIixDaTKyIiIiIi5TG5MlM3bgAJCUCuXICPj9LREBERERERkyszJQ8JLF0asOG3SERERESkOF6WmykWsyAiIiIiMi1MrswUi1kQEREREZkWJldmij1XRERERESmhcmVmWLPFRERERGRaWFyZYaePAEePxbbpUopGwsREREREQlMrsyQPCTQ1xdwdlY2FiIiIiIiEphcmSEOCSQiIiIiMj1MrswQi1kQEREREZkeJldmiD1XRERERESmh8mVGWLPFRERERGR6WFyZWYSEoDISLHNnisiIiIiItPB5MrMXL8OJCaKKoHe3kpHQ0REREREMiZXZkaeb1W6NKBSKRsLERERERElY3JlZjjfioiIiIjINDG5MjOsFEhEREREZJqYXJkZJldERERERKaJyZUZkSTdOVdERERERGQ6mFyZkcePgWfPRCGLkiWVjoaIiIiIiFJicmVG5GIWhQsDTk7KxkJERERERLqYXJkRzrciIiIiIjJdTK7MCMuwExERERGZLiZXZoQ9V0REREREpovJlRlhzxURERERkelicmUm4uOB69fFNnuuiIiIiIhMD5MrMxEZCWg0gIsL4OWldDRERERERPQuJldmIuWQQJVK2ViIiIiIiCg1JldmgsUsiIiIiIhMG5MrM8FiFkREREREpo3JlZlgzxURERERkWljcmUGJIk9V0REREREpo7JlRl4+BB4/lwUsihZUuloiIiIiIgoLUyuzIDca1W0KODoqGwsRERERESUNiZXZkCeb8UhgUREREREpovJlRlgMQsiIiIiItPH5MoMsJgFEREREZHpY3JlBthzRURERERk+phcmbg3b4CbN8U2e66IiIiIiEwXkysTptEAP/8MJCUBzs6Au7vSERERERERUXqYXJmo0FDAzw/o3l38HBsrSrGHhioaFhERERERpYPJlQkKDQXatgXu3tXdHxUl9jPBIiIiIiIyPUyuTIxGAwwaBEhS6sfkfYMHi+OIiIiIiMh0MLkyMYcOpe6xSkmSgDt3xHFERERERGQ6mFyZmOho/R5HRERERETGweTKxHh56fc4IiIiIiIyDiZXJiYoCPDxAVSqtB9XqQBfX3EcERERERGZDiZXJkatBhYtEtvvJljyzwsXiuOIiIiIiMh0MLkyQa1bA1u3At7euvt9fMT+1q2ViYuIiIiI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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 数据\n",
    "n_estimators = [\n",
    "    10, 20, 30, 40, 50, 60, 70, 80, 90, 100, \n",
    "    110, 120, 130, 140, 150, 160, 170, 180, 190, 200\n",
    "]\n",
    "accuracies = [\n",
    "    0.8143712574850299, 0.8383233532934131, 0.8203592814371258, 0.8203592814371258, \n",
    "    0.8263473053892215, 0.8323353293413174, 0.8383233532934131, 0.8203592814371258, \n",
    "    0.8383233532934131, 0.8323353293413174, 0.8383233532934131, 0.844311377245509, \n",
    "    0.8502994011976048, 0.8502994011976048, 0.844311377245509, 0.8502994011976048, \n",
    "    0.8502994011976048, 0.8562874251497006, 0.8562874251497006, 0.8562874251497006\n",
    "]\n",
    "\n",
    "# 创建折线图\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(n_estimators, accuracies, marker='o', linestyle='-', color='blue')\n",
    "\n",
    "# 添加标题和标签\n",
    "plt.title('Accuracy vs. Number of Trees (n_estimators)')\n",
    "plt.xlabel('Number of Trees (n_estimators)')\n",
    "plt.ylabel('Accuracy')\n",
    "\n",
    "# 标记最优点\n",
    "best_n = n_estimators[accuracies.index(max(accuracies))]\n",
    "best_acc = max(accuracies)\n",
    "plt.plot(best_n, best_acc, marker='o', color='red')\n",
    "plt.text(best_n, best_acc + 0.005, f'Best n={best_n}\\nAccuracy={best_acc:.3f}', ha='center', fontsize=10)\n",
    "\n",
    "# 显示图表\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f4c3757-128f-438a-85f0-d5833e0e1f7b",
   "metadata": {},
   "source": [
    "归类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "f2b8ae62-b2af-4dfb-9806-b69144bde357",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>66.605203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>67.486857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>66.081525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>65.580365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>65.889314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>66.086292</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.007432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.144719</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格\n",
       "0    A0001  22.566142  113.980837  66.0       0  66.605203\n",
       "1    A0002  22.686205  113.940525  65.5       0  67.486857\n",
       "2    A0003  22.576512  113.957198  65.5       1  66.081525\n",
       "3    A0004  22.564841  114.244571  75.0       0  65.580365\n",
       "4    A0005  22.558888  113.950723  65.5       0  65.889314\n",
       "..     ...        ...         ...   ...     ...        ...\n",
       "830  A0831  23.044062  113.125784  65.5       0  66.086292\n",
       "831  A0832  22.833262  113.280152  72.0       1  65.007432\n",
       "832  A0833  22.814676  113.827731  85.0       1  65.000000\n",
       "833  A0834  23.063674  113.771188  65.5       1  70.697085\n",
       "834  A0835  23.123294  113.110382  85.0       1  65.144719\n",
       "\n",
       "[835 rows x 6 columns]"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task   # 所有任务点数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "9d735bf4-dac5-4a11-985f-b3e080654f45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>预测合理价格</th>\n",
       "      <th>会员因子分数</th>\n",
       "      <th>竞争因子分数</th>\n",
       "      <th>预测任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>66.0</td>\n",
       "      <td>0</td>\n",
       "      <td>74.310175</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.321041</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>79.423768</td>\n",
       "      <td>0.259111</td>\n",
       "      <td>0.238261</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>65.5</td>\n",
       "      <td>1</td>\n",
       "      <td>71.272848</td>\n",
       "      <td>0.096090</td>\n",
       "      <td>0.120215</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>75.0</td>\n",
       "      <td>0</td>\n",
       "      <td>68.366117</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.116073</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>70.158023</td>\n",
       "      <td>0.064608</td>\n",
       "      <td>0.113255</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>828</th>\n",
       "      <td>A0829</td>\n",
       "      <td>23.179030</td>\n",
       "      <td>112.876192</td>\n",
       "      <td>80.0</td>\n",
       "      <td>1</td>\n",
       "      <td>69.900102</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.168969</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>829</th>\n",
       "      <td>A0830</td>\n",
       "      <td>23.123411</td>\n",
       "      <td>113.151775</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.176826</td>\n",
       "      <td>0.006097</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>65.5</td>\n",
       "      <td>0</td>\n",
       "      <td>71.300491</td>\n",
       "      <td>0.081730</td>\n",
       "      <td>0.135528</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>72.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.043107</td>\n",
       "      <td>0.001486</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>85.0</td>\n",
       "      <td>1</td>\n",
       "      <td>65.839371</td>\n",
       "      <td>0.028944</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>657 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务标价  任务执行情况     预测合理价格    会员因子分数  \\\n",
       "0    A0001  22.566142  113.980837  66.0       0  74.310175  0.000000   \n",
       "1    A0002  22.686205  113.940525  65.5       0  79.423768  0.259111   \n",
       "2    A0003  22.576512  113.957198  65.5       1  71.272848  0.096090   \n",
       "3    A0004  22.564841  114.244571  75.0       0  68.366117  0.000000   \n",
       "4    A0005  22.558888  113.950723  65.5       0  70.158023  0.064608   \n",
       "..     ...        ...         ...   ...     ...        ...       ...   \n",
       "828  A0829  23.179030  112.876192  80.0       1  69.900102  0.000000   \n",
       "829  A0830  23.123411  113.151775  85.0       1  65.176826  0.006097   \n",
       "830  A0831  23.044062  113.125784  65.5       0  71.300491  0.081730   \n",
       "831  A0832  22.833262  113.280152  72.0       1  65.043107  0.001486   \n",
       "834  A0835  23.123294  113.110382  85.0       1  65.839371  0.028944   \n",
       "\n",
       "       竞争因子分数  预测任务执行情况  \n",
       "0    0.321041         1  \n",
       "1    0.238261         0  \n",
       "2    0.120215         0  \n",
       "3    0.116073         0  \n",
       "4    0.113255         0  \n",
       "..        ...       ...  \n",
       "828  0.168969         1  \n",
       "829  0.000000         1  \n",
       "830  0.135528         1  \n",
       "831  0.000000         1  \n",
       "834  0.000000         0  \n",
       "\n",
       "[657 rows x 9 columns]"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new_task_except  # 排除东莞市的任务点数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "f24dd6c8-c42c-4fa7-84f3-6a507745b617",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用 '预测合理价格' 列的值覆盖 '任务标价' 列的值\n",
    "df_new_task_except['任务标价'] = df_new_task_except['预测合理价格']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "dee7fc13-744e-4a62-9c6a-f975ac0b6047",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_new_task_except['任务执行情况'] = df_new_task_except['预测任务执行情况']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "fa623436-e331-4e7f-ae28-8f5d91e1a563",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_new_task_except = df_new_task_except[['任务号码', '任务gps纬度', '任务gps经度', '任务标价', '任务执行情况']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "1c2ef20c-b526-42db-85a1-ae4a58919a20",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>74.310175</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>79.423768</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>71.272848</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>68.366117</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>70.158023</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>828</th>\n",
       "      <td>A0829</td>\n",
       "      <td>23.179030</td>\n",
       "      <td>112.876192</td>\n",
       "      <td>69.900102</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>829</th>\n",
       "      <td>A0830</td>\n",
       "      <td>23.123411</td>\n",
       "      <td>113.151775</td>\n",
       "      <td>65.176826</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0831</td>\n",
       "      <td>23.044062</td>\n",
       "      <td>113.125784</td>\n",
       "      <td>71.300491</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0832</td>\n",
       "      <td>22.833262</td>\n",
       "      <td>113.280152</td>\n",
       "      <td>65.043107</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0835</td>\n",
       "      <td>23.123294</td>\n",
       "      <td>113.110382</td>\n",
       "      <td>65.839371</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>657 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度       任务标价  任务执行情况\n",
       "0    A0001  22.566142  113.980837  74.310175       1\n",
       "1    A0002  22.686205  113.940525  79.423768       0\n",
       "2    A0003  22.576512  113.957198  71.272848       0\n",
       "3    A0004  22.564841  114.244571  68.366117       0\n",
       "4    A0005  22.558888  113.950723  70.158023       0\n",
       "..     ...        ...         ...        ...     ...\n",
       "828  A0829  23.179030  112.876192  69.900102       1\n",
       "829  A0830  23.123411  113.151775  65.176826       1\n",
       "830  A0831  23.044062  113.125784  71.300491       1\n",
       "831  A0832  22.833262  113.280152  65.043107       1\n",
       "834  A0835  23.123294  113.110382  65.839371       0\n",
       "\n",
       "[657 rows x 5 columns]"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new_task_except"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff32a1df-39dc-4705-8b90-d5ba8b0ff476",
   "metadata": {},
   "source": [
    "更新任务标价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "10bb2007-c8d1-42e1-b5c9-3a1eab362d6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 删除任务标价列\n",
    "df_task = df_task.drop(columns=['任务标价'])\n",
    "# 将“预测合理价格”列重命名为“任务标价”\n",
    "df_task = df_task.rename(columns={'预测合理价格': '任务标价'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "228e8cec-0283-4d68-b2df-c725138c068a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务执行情况</th>\n",
       "      <th>任务标价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>372</th>\n",
       "      <td>A0373</td>\n",
       "      <td>23.097051</td>\n",
       "      <td>113.658152</td>\n",
       "      <td>1</td>\n",
       "      <td>67.149492</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>482</th>\n",
       "      <td>A0483</td>\n",
       "      <td>23.044908</td>\n",
       "      <td>113.788434</td>\n",
       "      <td>1</td>\n",
       "      <td>66.505060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>485</th>\n",
       "      <td>A0486</td>\n",
       "      <td>22.777591</td>\n",
       "      <td>113.751681</td>\n",
       "      <td>1</td>\n",
       "      <td>65.396385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>486</th>\n",
       "      <td>A0487</td>\n",
       "      <td>22.721038</td>\n",
       "      <td>114.179052</td>\n",
       "      <td>1</td>\n",
       "      <td>65.043406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>487</th>\n",
       "      <td>A0488</td>\n",
       "      <td>22.812305</td>\n",
       "      <td>114.172988</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>806</th>\n",
       "      <td>A0807</td>\n",
       "      <td>23.039098</td>\n",
       "      <td>113.773178</td>\n",
       "      <td>1</td>\n",
       "      <td>65.611801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>807</th>\n",
       "      <td>A0808</td>\n",
       "      <td>22.846704</td>\n",
       "      <td>114.159286</td>\n",
       "      <td>1</td>\n",
       "      <td>65.544384</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>827</th>\n",
       "      <td>A0828</td>\n",
       "      <td>23.012808</td>\n",
       "      <td>113.760312</td>\n",
       "      <td>1</td>\n",
       "      <td>68.158712</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>1</td>\n",
       "      <td>65.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>1</td>\n",
       "      <td>70.697085</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度  任务执行情况       任务标价\n",
       "372  A0373  23.097051  113.658152       1  67.149492\n",
       "482  A0483  23.044908  113.788434       1  66.505060\n",
       "485  A0486  22.777591  113.751681       1  65.396385\n",
       "486  A0487  22.721038  114.179052       1  65.043406\n",
       "487  A0488  22.812305  114.172988       1  65.000000\n",
       "..     ...        ...         ...     ...        ...\n",
       "806  A0807  23.039098  113.773178       1  65.611801\n",
       "807  A0808  22.846704  114.159286       1  65.544384\n",
       "827  A0828  23.012808  113.760312       1  68.158712\n",
       "832  A0833  22.814676  113.827731       1  65.000000\n",
       "833  A0834  23.063674  113.771188       1  70.697085\n",
       "\n",
       "[178 rows x 5 columns]"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_task.iloc[eccept_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "0b2ce151-d00e-45a1-af30-85bc3a780ac4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>任务号码</th>\n",
       "      <th>任务gps纬度</th>\n",
       "      <th>任务gps经度</th>\n",
       "      <th>任务标价</th>\n",
       "      <th>任务执行情况</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A0001</td>\n",
       "      <td>22.566142</td>\n",
       "      <td>113.980837</td>\n",
       "      <td>74.310175</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A0002</td>\n",
       "      <td>22.686205</td>\n",
       "      <td>113.940525</td>\n",
       "      <td>79.423768</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A0003</td>\n",
       "      <td>22.576512</td>\n",
       "      <td>113.957198</td>\n",
       "      <td>71.272848</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>A0004</td>\n",
       "      <td>22.564841</td>\n",
       "      <td>114.244571</td>\n",
       "      <td>68.366117</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A0005</td>\n",
       "      <td>22.558888</td>\n",
       "      <td>113.950723</td>\n",
       "      <td>70.158023</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>830</th>\n",
       "      <td>A0807</td>\n",
       "      <td>23.039098</td>\n",
       "      <td>113.773178</td>\n",
       "      <td>65.611801</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>831</th>\n",
       "      <td>A0808</td>\n",
       "      <td>22.846704</td>\n",
       "      <td>114.159286</td>\n",
       "      <td>65.544384</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>832</th>\n",
       "      <td>A0828</td>\n",
       "      <td>23.012808</td>\n",
       "      <td>113.760312</td>\n",
       "      <td>68.158712</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>833</th>\n",
       "      <td>A0833</td>\n",
       "      <td>22.814676</td>\n",
       "      <td>113.827731</td>\n",
       "      <td>65.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>834</th>\n",
       "      <td>A0834</td>\n",
       "      <td>23.063674</td>\n",
       "      <td>113.771188</td>\n",
       "      <td>70.697085</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>835 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      任务号码    任务gps纬度     任务gps经度       任务标价  任务执行情况\n",
       "0    A0001  22.566142  113.980837  74.310175       1\n",
       "1    A0002  22.686205  113.940525  79.423768       0\n",
       "2    A0003  22.576512  113.957198  71.272848       0\n",
       "3    A0004  22.564841  114.244571  68.366117       0\n",
       "4    A0005  22.558888  113.950723  70.158023       0\n",
       "..     ...        ...         ...        ...     ...\n",
       "830  A0807  23.039098  113.773178  65.611801       1\n",
       "831  A0808  22.846704  114.159286  65.544384       1\n",
       "832  A0828  23.012808  113.760312  68.158712       1\n",
       "833  A0833  22.814676  113.827731  65.000000       1\n",
       "834  A0834  23.063674  113.771188  70.697085       1\n",
       "\n",
       "[835 rows x 5 columns]"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用 pd.concat 将 除去东莞市的三市数据、东莞市数据，这两个 DataFrame 上下拼接\n",
    "df_combined = pd.concat([df_new_task_except, df_task.iloc[eccept_index]])\n",
    "\n",
    "# 重置索引以确保索引唯一并连续\n",
    "df_combined.reset_index(drop=True, inplace=True)\n",
    "\n",
    "# 查看合并后的 DataFrame\n",
    "df_combined"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "f8cf0d3d-6603-47d2-a1c1-8c9dc4d86950",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "73.58571649242556"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_combined['任务标价'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "a217a6ec-d39b-4abd-a4de-c76c42be1cd8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "575"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_combined['任务执行情况'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "fa78f25f-62fd-465f-bf39-280d662f4595",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_combined.to_excel('../data/combined_tasks.xlsx', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9848ca2c-6621-4bfe-8bdd-998a01b9802a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
